package br.org.acessobrasil.portal.persistencia;

import java.util.List;

import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;

import org.springframework.transaction.annotation.Transactional;

import br.org.acessobrasil.portal.modelo.Arquivo;
import br.org.acessobrasil.portal.modelo.Sitio;
@Transactional
public class ArquivoDaoSpring implements ArquivoDao{
	private EntityManager em;
	private static ArquivoDaoSpring instance;
	public ArquivoDaoSpring(){
		instance = this;
	}
	@PersistenceContext
	public void setEntityManager(EntityManager em) {
		this.em = em;
	}

	private EntityManager getEntityManager() {
		return em;
	}
	
	public void apagar(Arquivo arquivo) throws Exception {
		getEntityManager().remove(arquivo);		
	}

	
	public void create(Arquivo arquivo) throws Exception {
		getEntityManager().persist(arquivo);
	}

	@Deprecated
	@SuppressWarnings("unchecked")
	public List<Arquivo> listar() throws Exception {
		return getEntityManager().createQuery("Select a from Arquivo a order by a.no_arquivo").getResultList();
	}
	
	@SuppressWarnings("unchecked")
	public List<Arquivo> listar(Sitio sitio) throws Exception {
		return getEntityManager().createQuery("Select a from Arquivo a where a.sitio = ? order by a.no_arquivo").setParameter(1, sitio).getResultList();
	}

	@Deprecated
	@SuppressWarnings("unchecked")
	public List<Arquivo> procurar(String buscar) {
		Query q = getEntityManager().createQuery("Select a from Arquivo a where a.no_arquivo like ? or a.de_arquivo like ? or a.setor.no_setor like ? order by a.no_arquivo");
		q.setParameter(1,"%"+buscar+"%");
		q.setParameter(2,"%"+buscar+"%");
		q.setParameter(3,"%"+buscar+"%");
		return q.getResultList();
	}
	
	@SuppressWarnings("unchecked")
	public List<Arquivo> procurar(String buscar, Sitio sitio) {
		Query q = getEntityManager().createQuery("Select a from Arquivo a where ( a.sitio = ? and (a.no_arquivo like ? or a.de_arquivo like ? or a.setor.no_setor like ?)) order by a.no_arquivo");
		q.setParameter(1,sitio);
		q.setParameter(2,"%"+buscar+"%");
		q.setParameter(3,"%"+buscar+"%");
		q.setParameter(4,"%"+buscar+"%");
		return q.getResultList();
	}
	
	/**
	 * Busca um arquivo pelo seu nome exato
	 * @param nomeDoArquivo
	 * @param sitio
	 * @return O arquivo do nome especificado ou null se nao existir no banco
	 */
	public Arquivo buscarPorNomeExato(String nomeDoArquivo, Sitio sitio){
		Query q = getEntityManager().createQuery("from Arquivo a where a.sitio = ? and a.no_arquivo = ?");
		q.setParameter(1,sitio);
		q.setParameter(2,nomeDoArquivo);
		try{
			return (Arquivo) q.getSingleResult();
		}catch (Exception e) {
			return null;
		}	
	}

	
	public Arquivo select(Long nu_arquivo) throws Exception {
		return getEntityManager().find(Arquivo.class, nu_arquivo);
	}
	
	@Deprecated
	@SuppressWarnings("unchecked")
	public Arquivo select(String no_arquivo) throws Exception {
		Query q = getEntityManager().createQuery("Select a from Arquivo a where a.no_arquivo=?");
		q.setParameter(1, no_arquivo);
		List<Arquivo> arqs=q.getResultList();
		if(arqs.size()>0){
			return arqs.get(0);
		}else{
			return null;
		}
	}
	
	@SuppressWarnings("unchecked")
	public Arquivo select(String no_arquivo, Sitio sitio) throws Exception {
		Query q = getEntityManager().createQuery("Select a from Arquivo a where a.no_arquivo=? and a.sitio = ?");
		q.setParameter(1, no_arquivo);
		q.setParameter(2, sitio);
		List<Arquivo> arqs=q.getResultList();
		if(arqs.size()>0){
			return arqs.get(0);
		}else{
			return null;
		}
	}

	
	public void update(Arquivo arquivo) {
		getEntityManager().merge(arquivo);
	}

	public static ArquivoDaoSpring getInstance() {
		return instance;
	}

}
